/***********************************************************************************
 * 文件名： N32_Config.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 * 		N32 统一配置文件。
***********************************************************************************/
#ifndef _N32_CONFIG_H_
#define _N32_CONFIG_H_

#include "rtconfig.h"

// 型号系列
#define N32_MCU_SERIES     N32G455      


/////////////////////////////////////////////////////////////////////////////////////
// 外设的初始参数配置，调用相应的初始化函数后将按照以下参数进行初始化，如需运行过程中修改参数
// 调用对应驱动的API即可。对于不使用的外设（不调用Init函数）可以不必理会其配置参数。
/////////////////////////////////////////////////////////////////////////////////////

//////////////////////// 时钟配置（SystemInit）

#ifndef HSE_VALUE
#define HSE_VALUE   (8000000) /*!< Value of the External oscillator in Hz */
#endif

/**
 * 0 - HSI
 * 1 - HSE
 * 2 - HSI-PLL(最大128MHz)
 * 3 - HSE-PLL(最大144MHz)
*/
#define SYSCLK_SRC  2

#define F_HCLK              128      // MHz

#define _ADC_CLK_DIV    RCC_ADCHCLK_DIV8

/**
 *  AHB(144M)外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_AHB_PERIPH_DMA1, RCC_AHB_PERIPH_DMA2, RCC_AHB_PERIPH_SRAM,
 *          RCC_AHB_PERIPH_FLITF, RCC_AHB_PERIPH_CRC, RCC_AHB_PERIPH_RNGC,
 *          RCC_AHB_PERIPH_SDIO, RCC_AHB_PERIPH_SAC, RCC_AHB_PERIPH_ADC1,
 *          RCC_AHB_PERIPH_ADC2, RCC_AHB_PERIPH_ADC3, RCC_AHB_PERIPH_ADC4,
 *          RCC_AHB_PERIPH_ETHMAC, RCC_AHB_PERIPH_QSPI
 * @note SRAM and FLITF clock can be disabled only during sleep mode.
*/
#define RCC_AHB_PERIPH_CLKEN    RCC_AHB_PERIPH_SRAM|RCC_AHB_PERIPH_FLITF\
    |RCC_AHB_PERIPH_DMA1|RCC_AHB_PERIPH_DMA2|RCC_AHB_PERIPH_ADC1

/**
 *  APB1(36M)外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_APB1_PERIPH_TIM2, RCC_APB1_PERIPH_TIM3, RCC_APB1_PERIPH_TIM4,
 *          RCC_APB1_PERIPH_TIM5, RCC_APB1_PERIPH_TIM6, RCC_APB1_PERIPH_TIM7,
 *          RCC_APB1_PERIPH_COMP, RCC_APB1_PERIPH_COMP_FILT, RCC_APB1_PERIPH_TSC,
 *          RCC_APB1_PERIPH_WWDG, RCC_APB1_PERIPH_SPI2, RCC_APB1_PERIPH_SPI3,
 *          RCC_APB1_PERIPH_USART2, RCC_APB1_PERIPH_USART3, RCC_APB1_PERIPH_UART4,
 *          RCC_APB1_PERIPH_UART5, RCC_APB1_PERIPH_I2C1, RCC_APB1_PERIPH_I2C2,
 *          RCC_APB1_PERIPH_USB, RCC_APB1_PERIPH_CAN1, RCC_APB1_PERIPH_CAN2, RCC_APB1_PERIPH_BKP,
 *          RCC_APB1_PERIPH_PWR, RCC_APB1_PERIPH_DAC, RCC_APB1_PERIPH_OPAMP
*/
#define RCC_APB1_PERIPH_CLKEN   RCC_APB1_PERIPH_UART5

/**
 *  APB2(72M)外设时钟使能初始使能，需要用到的外设可以在这里统一使能时钟门控，多个外设用 | 隔开
 *          RCC_APB2_PERIPH_AFIO, RCC_APB2_PERIPH_GPIOA, RCC_APB2_PERIPH_GPIOB,
 *          RCC_APB2_PERIPH_GPIOC, RCC_APB2_PERIPH_GPIOD, RCC_APB2_PERIPH_GPIOE,
 *          RCC_APB2_PERIPH_GPIOF, RCC_APB2_PERIPH_GPIOG, RCC_APB2_PERIPH_TIM1,
 *          RCC_APB2_PERIPH_SPI1, RCC_APB2_PERIPH_TIM8, RCC_APB2_PERIPH_USART1,
 *          RCC_APB2_PERIPH_DVP, RCC_APB2_PERIPH_UART6, RCC_APB2_PERIPH_UART7,
 *          RCC_APB2_PERIPH_I2C3, RCC_APB2_PERIPH_I2C4
*/
#define RCC_APB2_PERIPH_CLKEN   RCC_APB2_PERIPH_AFIO|RCC_APB2_PERIPH_GPIOA\
    |RCC_APB2_PERIPH_GPIOB|RCC_APB2_PERIPH_GPIOC|RCC_APB2_PERIPH_GPIOD|RCC_APB2_PERIPH_GPIOE\
    |RCC_APB2_PERIPH_USART1|RCC_APB2_PERIPH_UART7|RCC_APB2_PERIPH_TIM8

//////////////////////// APP 起始地址
// 本软件在FLASH中保存的起始地址(相对地址、偏移)
// 如果OTA升级(存在BootLoader)，用户程序起始地址可能不为0，必须修改实际的起始地址，
// 这会影响中断向量表地址寄存器（VTOR），和Flash的读写操作。
// 与实际不符会导致中断无法响应、跑飞！！！
#define APP_BASE    0

//////////////////////// SysTick 的配置

#define SYSTICK_VALUE       (10 * 1000l * F_HCLK)   // 1~0xFFFFFF，第一个数字代表定时周期ms

/////////////////////// Delay的配置

#define DELAY_TIM_INIT                          // Delay 所使用的定时器初始化，如果在别处初始化了这里留空。
#define DELAY_COUNTER           SysTick->VAL    // 计数寄存器，默认是递减计数。
#define DELAY_COUNT_PERIOD      (1000 * F_HCLK) // 计数周期（重载值）,这里不是设置，只是告知延时驱动定时器的重载值。
#define DELAY_COUNT_PER_US      F_HCLK          // 1us 的计数个数 （计数的频率，单位MHz. SysTick会被库函数设置为HCLK）

/////////////////////// GPIO初始配置

// 初始输出寄存器值

#define _GPIO_PA_ODR    0x0000
#define _GPIO_PB_ODR    0x0000
#define _GPIO_PC_ODR    0x0000
#define _GPIO_PD_ODR    0x0000
#define _GPIO_PE_ODR    0x0000
#define _GPIO_PF_ODR    0x0000
#define _GPIO_PG_ODR    0x0000

// 初始模式列表
#define _GPIO_INIT_LIST \
{   \
    {GPIOA, GPIO_PIN_9, GPIO_Mode_AF_PP, GPIO_Speed_50MHz},   \
    {GPIOA, GPIO_PIN_10, GPIO_Mode_IN_FLOATING, GPIO_INPUT},   \
    {GPIOB, GPIO_PIN_5, GPIO_Mode_Out_PP, GPIO_Speed_50MHz},   \
}

/////////////////////// Uart 初始配置
// 不开启对应的UART可以节省内存资源。
// BUFF_SIZE 为 0 时表示不启用对应的缓存功能。
// 如果你在串口中断中直接获取收到的字节并及时处理了建议不开启接收缓存。
// 接收中断中通知线程去处理的方式因为不能确保线程及时得到运行，建议开启接收缓存。
// 建议始终开启发送缓存，否则发送将死等。设置合适的缓存尺寸，如果未开启缓存尺寸自动调整，缓存满了也会死等或者阻塞。

#define _UART_USE_USART1
// #define _UART_USE_USART2
// #define _UART_USE_USART3
// #define _UART_USE_UART4
// #define _UART_USE_UART5
// #define _UART_USE_UART6
// #define _UART_USE_UART7

#ifdef _UART_USE_USART1
    #define _UART_USART1_NAME           ConsoleUart
    #define _UART_USART1_TX_BUFF_SIZE   1024     /* 最大65535 */
    #define _UART_USART1_RX_BUFF_SIZE   32      /* 最大65535 */
#endif
#ifdef _UART_USE_USART2
    #define _UART_USART2_NAME           Uart2
    #define _UART_USART2_TX_BUFF_SIZE   128
    #define _UART_USART2_RX_BUFF_SIZE   0
#endif
#ifdef _UART_USE_USART3
    #define _UART_USART3_NAME           Uart3
    #define _UART_USART3_TX_BUFF_SIZE   128
    #define _UART_USART3_RX_BUFF_SIZE   0
#endif
#ifdef _UART_USE_UART4
    #define _UART_UART4_NAME            Uart4
    #define _UART_UART4_TX_BUFF_SIZE    128
    #define _UART_UART4_RX_BUFF_SIZE    0
#endif
#ifdef _UART_USE_UART5
    #define _UART_UART5_NAME            TurmUart
    #define _UART_UART5_TX_BUFF_SIZE    8
    #define _UART_UART5_RX_BUFF_SIZE    0
#endif
#ifdef _UART_USE_UART6
    #define _UART_UART6_NAME            Uart6
    #define _UART_UART6_TX_BUFF_SIZE    128
    #define _UART_UART6_RX_BUFF_SIZE    0
#endif
#ifdef _UART_USE_UART7
    #define _UART_UART7_NAME            RemoteUart
    #define _UART_UART7_TX_BUFF_SIZE    136
    #define _UART_UART7_RX_BUFF_SIZE    0
#endif

/**
 * 缓存方式
 * 0 - 静态定义缓存，始终占用固定内存。【CPU占用最低，依耐最小，缓存不大时推荐】
 * 1 - 动态申请，串口关闭后释放，尺寸固定。
 * 2 - 动态申请，串口关闭后释放，尺寸自动调整，静态定义的为最小尺寸。
 * 3 - 动态申请，发送完毕，或者读完数据后自动释放，尺寸自动调整，静态定义的为最小尺寸。【缓存需要很大，内存资源又紧张时使用，CPU占用最高】
*/
#define _UART_BUFF_MODE     0

/**
 * 阻塞方式。在写入（发送）时缓存满了，在读取时缓存为空，这两种情况下的处理策略。
 * 1 - 写入死等阻塞，读取不阻塞返回实际读取的字节数（单字节读取返回-1表示没有数据）。【推荐】
 * 2 - 写入信号量阻塞，读取不阻塞返回实际读取的字节数（单字节读取返回-1表示没有数据）。
 * 4 - 写入信号量阻塞，读取信号量阻塞
*/
#define _UART_BLOCKING_MODE     1

////////////////////////// 内存管理API定义

#if _UART_BUFF_MODE != 0
    #define _MCU_USE_STD_MEM_ALLOC
    #ifndef _MCU_USE_STD_MEM_ALLOC
        #define _MCU_MEM_INCLUDE    <stdlib.h>
        #define _Mcu_Alloc(size)    malloc(size)
        #define _Mcu_Free()         free()
        #define _Mcu_ReAlloc(size)  realloc(size)
    #endif
#endif

/////////////////////////////////////////////////////////////////////////////////////
// RTT标准设备驱动配置（启用配置）
/////////////////////////////////////////////////////////////////////////////////////
#ifdef RT_USING_DEVICE

#define N32_USE_RTT_DRV

#define BSP_USING_USART1

#endif

#endif
